文章目录
  1. 1. 介绍
  2. 2. 准备
  3. 3. layout文件
  4. 4. data对象
  5. 5. binding对象
  6. 6. 深入layout文件

介绍

谷歌最近推出了databinding技术,可以在layout文件就是xml中直接绑定数据,不用像以前那样先findViewById()setText()了。其实这个技术微软的开发平台上早就有了,确实很方便的说。

准备

  • android studio 1.3.0-beta1或更高版本

  • 在gradle里添加databinding

1
2
3
4
dependencies {
classpath "com.android.tools.build:gradle:1.2.3"
classpath "com.android.databinding:dataBinder:1.0-rc0"
}
1
2
apply plugin: ‘com.android.application'
apply plugin: 'com.android.databinding'

layout文件

根元素必须是layout,然后是一个data元素,一个普通的view元素。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>

</LinearLayout>
</layout>

data里面是绑定的数据user,android:text="@{user.firstName}"就是把TextViewtext属性绑定userfirstName属性,很方便吧!

data对象

这个简单,比如User:

1
2
3
4
public class User {
private String firstName;
private String lastName;
}

别忘了加上gettersetter,很关键!

binding对象

做完了上面的,就会自动生成一个Binding类,名字是根据layout文件的名字起的。比如,上面那个layout文件叫做activity_main.xml,那么就会自动生成一个ActivityMainBinding类,这个类持有Userlayout里的所有属性。我创建一个binding对象并给它设置数据,它就自动把数据绑定到layout里了。比如:

1
2
3
4
5
6
7
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
}

如果是在RecyclerView的Adapter里,可以这样:

1
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

深入layout文件

layout文件里支持表达式,比如:

1
2
3
4
5
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

但是你用到了View类,必须import,就像在java文件里那样。比如:

1
2
3
<data>
<import type="android.view.View"/>
</data>

现在android studio对databinding的支持还不完善,可能写xml的时候很多地方会没有智能提示。。。
具体指南请参考:databinding中文指南(翻译)

文章目录
  1. 1. 介绍
  2. 2. 准备
  3. 3. layout文件
  4. 4. data对象
  5. 5. binding对象
  6. 6. 深入layout文件